## 06 模块

import fibo

'''模块是一个包含Python定义和语句的文件。
文件名就是模块名后跟文件后缀 .py 。
'''
print(fibo.__name__)
print(fibo.fib.__name__)
fibo.fib(10)
r = fibo.fib2(100)
print(r)

fib = fibo.fib
fib(500)

### 6.1 更多有关模块的信息
'''模块有 可执行的语句及函数定义
import 时执行, 动作脚本文件运行时执行
'''

'''from  xx  import xxx
直接导入到现模块的符号表里, 
可直接调用
'''
# from fibo import fib, fib2      # 可直接 fib(1), fib2(3)

'''from xx import *
会调入非 _ 开头的名称
不推荐使用, 
因为它在解释器中引入了一组未知的名称，而它们很可能会覆盖一些你已经定义过的东西。
'''
from fibo import *
r2 = fib2(10)                   # 不用使用  fibo.fib2(10)
print("r2: ", r2)
'''_private_fib(2)                 # _ 开头的名称没有被导入, NameError: name '_private_fib' is not defined'''

'''import xx as xx2
'''
import fibo as fibofibo
fibofibo.fib( 12)

'''私有符号表
'''

'''模块可以导入其它模块
'''

#### 6.1.1. 以脚本的方式执行模块

''' if __name__ == "__main__":
作为 import 模块导入时不会运行, 作为脚本方式执行会运行 
'''

#### 6.1.2. 模块搜索路径
import sys
print(sys.path)

#### 6.1.3. “编译过的”Python文件
'''__pycache__ 目录
为了加速模块载入，Python在 __pycache__ 目录里缓存了每个模块的编译后版本
'''

### 6.2. 标准模块

### 6.3. dre() 函数
'''内置函数 dir() 查找模块定义的名称
注意：它列出所有类型的名称：变量，模块，函数，等等。
'''
import fibo

print('dir(fibo) : ', dir(fibo))
print('dir() : ', dir())


### 6.4 包


'''导入这个包时 , Python 搜索 sys.path 里的目录, 查找包的子目录
必须要有  __init__.py
from package import item
'''

'''导入单个模块
import sound.effects.echo
sound.effects.echo.echofilter('使用全名引用')
'''

'''导入子模块
from sound.effects import echo
echo.echofilter('不需要使用包前缀')
'''

'''直接导入所需函数或变量
from sound.effects.echo import echofilter
echofilter('直接使用函数')
'''

### 6.4.1. 从包导入
'''__init__.py  中的  __all__ 
如果一个包的 __init__.py 代码定义了一个名为 __all__ 的列表，
它会被视为在遇到 from package import * 时应该导入的模块名列表。
'''
from sound import *
echo.hello()
surround.hello()

'''推荐使用
from package import specific_submodule
'''

#### 6.4.2. 子包参考 TODO

''''from module import name 
使用绝对导入来引用兄弟包的子模块
'''

#### 6.4.3. 多个目录中的包

'''包的 __path__ 属性
初始化为一个列表
包含在执行该文件中的代码之前保存包的文件 __init__.py 的目录的名称
'''
